Go 编译时替换函数 supermonkey
使用方式:
package main
import (
"fmt"
sm "github.com/cch123/supermonkey"
)
func main() {
fmt.Println("original function output:")
heyHeyHey()
patchGuard := sm.PatchByFullSymbolName("main.heyHeyHey", func() {
fmt.Println("please be polite")
})
fmt.Println("after patch, function output:")
heyHeyHey()
patchGuard.Unpatch()
fmt.Println("unpatch, then output:")
heyHeyHey()
}
//go:noinline
func heyHeyHey() {
fmt.Println("fake")
}
输出时:
original function output:
fake
after patch, function output:
please be polite
unpatch, then output:
fake
确保有 nm 命令,运行时得包装项目没有被内联优化了
go run -gcflags="-l" yourfile.go
1.17 版本
go run -ldflags="-s=false" -gcflags="-l" main.go